#include <iostream>
//
// Created by Asus on 2025/4/20.
//
// 不使用指针和引用作为参数传递
// 按值传递，函数内部修改的是参数的副本，不会影响原始变量
void modifyByValue(int num) {
    num = 20;
    std::cout << "Inside modifyByValue: num = " << num << std::endl;
}

// 使用指针作为参数传递
// 传递变量的地址，函数内部可以通过指针修改原始变量的值
void modifyByPointer(int *ptr) {
    *ptr = 30;
    std::cout << "Inside modifyByPointer: *ptr = " << *ptr << std::endl;
}

// 使用引用作为参数传递
// 引用是变量的别名，函数内部对引用的修改会直接影响原始变量
void modifyByReference(int &ref) {
    ref = 40;
    std::cout << "Inside modifyByReference: ref = " << ref << std::endl;
}

// 使用引用作为参数传递
// 引用是变量的别名，函数内部对引用的修改会直接影响原始变量

int main() {
    int num = 10;
    // 值传递时，函数接收的是实参的副本，对副本的修改不会影响原始实参。
    // 基本数据类型（像int、float、char等）、自定义类类型、结构体类型等，在值传递时都无法修改原始实参。
    std::cout << "Before calling modifyByValue: num = " << num << std::endl;
    modifyByValue(num);
    std::cout << "After calling modifyByValue: num = " << num << std::endl;
    // 引用传递时，函数接收的是实参的引用，相当于给实参起了一个别名，对引用的修改会直接影响原始实参。
    // 基本数据类型、自定义类类型、结构体类型等都能通过引用传递来修改原始实参。
    std::cout << "\nBefore calling modifyByPointer: num = " << num << std::endl;
    modifyByPointer(&num);
    std::cout << "After calling modifyByPointer: num = " << num << std::endl;
    // 指针传递时，函数接收的是实参的地址，通过解引用操作可以修改原始实参。基本数据类型、自定义类类型、结构体类型等都能通过指针传递来修改原始实参。
    std::cout << "\nBefore calling modifyByReference: num = " << num << std::endl;
    modifyByReference(num);
    std::cout << "After calling modifyByReference: num = " << num << std::endl;

    return 0;
}
